#ifndef CR_H
#define CR_H

#include "bool.h"
#include "parStr.h"

typedef struct scr * cr;

typedef parStr elec;

cr
cr_create(char * f);
/*
  DESC: Constructor. Toma el nombre de archivo. 
  Si es vacio toma la entrada estandard 
  Devuelve NULL si no hay memoria.
  PRE: { c = NULL /\ f -> F }
  c = cr_create(f);  
  POS: {  Hay memoria ==>  c --> cr(F)   
  ! Hay memoria ==>  c = NULL  }   
*/

cr
cr_destroy(cr c);
/*
  DESC: Destructor del tipo. c cambia.
  PRE: { c --> C }
  c = cr_destroy(c);
  POS: { Se destruye C /\ c == NULL }
*/

cr
cr_arr(cr c);
/*
  DESC: Arranca la cinta.
  PRE: { c --> C }
  c = cr_arr(c);
  POS: {  Hay memoria /\ ! Error de Archivo ==> Pi(*c)=[] /\ Pd(*c)=Pd
  ! Hay memoria  \/  Error de Archivo ==> Se destruye C /\ c = NULL}
*/

bool
cr_fin(const cr c);
/*
  DESC: Pregunta si llego al final.
  PRE: { c --> C }
  PROP: cr_fin(c) == (Pd(*c) = [])
*/

cr
cr_av(cr c);
/*
  DESC: Avanza la cinta.
  PRE: { c-->C /\ Pi(C) = Pi /\ Pd(C) = e:Pd }
  c = cr_av(c);
  POS: {  Hay memoria /\ ! Error de Archivo ==> Pi(*c)=Pi:e /\ Pd(*c)=Pd
  ! Hay memoria  \/  Error de Archivo ==> Se destruye C /\ c = NULL}
*/

elec
cr_elecor(const cr c);
/*
  DESC: Elemento corriente de la cinta. 
  Crea copia del elecor (hay que destruirlo despues).
  PRE: { c-->C /\ Pi(C) = Pi /\ Pd(C) = e:Pd }
  el = cr_elecor(c);
  POS: {  c->C /\
  Hay memoria ==> el -> e 
  ! Hay memoria ==> el = NULL}
*/


#endif /* CR_H */
